package com.hmall.common.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collection;
import java.util.Map;

/**
 * Web工具类
 * 提供Web请求相关的通用操作方法，封装Servlet API
 */
@Slf4j
public class WebUtils {

    /**
     * 获取当前请求的ServletRequestAttributes
     * @return ServletRequestAttributes对象（请求不存在时返回null）
     */
    public static ServletRequestAttributes getServletRequestAttributes() {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        return ra != null ? (ServletRequestAttributes) ra : null;
    }

    /**
     * 获取当前请求的HttpServletRequest对象
     * @return HttpServletRequest对象（请求不存在时返回null）
     */
    public static HttpServletRequest getRequest() {
        ServletRequestAttributes attributes = getServletRequestAttributes();
        return attributes != null ? attributes.getRequest() : null;
    }

    /**
     * 获取当前请求的HttpServletResponse对象
     * @return HttpServletResponse对象（请求不存在时返回null）
     */
    public static HttpServletResponse getResponse() {
        ServletRequestAttributes attributes = getServletRequestAttributes();
        return attributes != null ? attributes.getResponse() : null;
    }

    /**
     * 获取请求头指定字段的值
     * @param headerName 请求头字段名
     * @return 字段值（不存在或请求不存在时返回null）
     */
    public static String getHeader(String headerName) {
        HttpServletRequest request = getRequest();
        return request != null ? request.getHeader(headerName) : null;
    }

    /**
     * 设置响应头字段
     * @param key 字段名
     * @param value 字段值
     */
    public static void setResponseHeader(String key, String value) {
        HttpServletResponse response = getResponse();
        if (response != null) {
            response.setHeader(key, value);
        }
    }

    /**
     * 判断响应是否为成功状态码（2xx）
     * @return true表示状态码小于300（成功）
     */
    public static boolean isSuccess() {
        HttpServletResponse response = getResponse();
        return response != null && response.getStatus() < 300;
    }

    /**
     * 从请求中获取所有参数并拼接为key=value&key=value格式
     * @param request HttpServletRequest对象
     * @return 参数字符串（无参数时返回空字符串）
     */
    public static String getParameters(HttpServletRequest request) {
        Map<String, String[]> parameterMap = request.getParameterMap();
        return getParameters(parameterMap);
    }

    /**
     * 从参数Map中拼接为key=value&key=value格式
     * @param queries 参数Map（支持String[]和Collection类型值）
     * @return 参数字符串（无参数时返回空字符串）
     */
    public static <T> String getParameters(final Map<String, T> queries) {
        StringBuilder buffer = new StringBuilder();
        for (Map.Entry<String, T> entry : queries.entrySet()) {
            String key = entry.getKey();
            T value = entry.getValue();

            // 处理String[]类型值（如request.getParameterMap）
            if (value instanceof String[]) {
                buffer.append(key).append(String.join(",", (String[]) value)).append("&");
            }
            // 处理Collection类型值（如自定义参数Map）
            else if (value instanceof Collection) {
                buffer.append(key).append(CollUtil.join((Collection<String>) value, ",")).append("&");
            }
        }
        return buffer.length() > 0 ? buffer.substring(0, buffer.length() - 1) : StrUtil.EMPTY;
    }

    /**
     * 从URL中提取URI部分（去掉协议和查询参数）
     * @param url 完整URL
     * @return URI字符串（如 /api/user/123）
     */
    public static String getUri(String url) {
        if (!StringUtils.hasText(url)) {
            return null;
        }

        String uri = url;
        // 移除协议头（http:// 或 https://）
        if (uri.contains("http://")) {
            uri = uri.replace("http://", StrUtil.EMPTY);
        } else if (uri.contains("https://")) {
            uri = uri.replace("https://", StrUtil.EMPTY);
        }

        // 定位URI结束位置（查询参数前）
        int endIndex = uri.length();
        if (uri.contains("?")) {
            endIndex = uri.indexOf("?");
        }
        // 提取URI部分（从第一个'/'开始到查询参数前）
        return uri.substring(uri.indexOf("/"), endIndex);
    }

    /**
     * 获取客户端IP地址（简化版，未处理反向代理场景）
     * @return 客户端IP（请求不存在时返回空字符串）
     */
    public static String getRemoteAddr() {
        HttpServletRequest request = getRequest();
        return request != null ? request.getRemoteAddr() : "";
    }

    /**
     * 创建CookieBuilder实例（封装Cookie操作）
     * @return CookieBuilder对象
     */
    public static CookieBuilder cookieBuilder() {
        return new CookieBuilder(getRequest(), getResponse());
    }
}